/**
 * 由于本工程为C语言开发环境，此代码使用cpp语法，故仅做汇总。
 * 运行调试使用Cpp_training工程。
 */

#include <stdio.h>

#define MAXSIZE 5
typedef int ElemType;
// 定义顺序栈
typedef struct {
    ElemType data[MAXSIZE];
    int top;
}SqStack;
// 定义循环队列
typedef struct {
    ElemType data[MAXSIZE];
    int front, rear;
}SqQueue;

/**
 * 栈 操作
 */
// 初始化一个顺序栈
void InitSqStack(SqStack &S) {
    S.top = -1;
}

// 入栈
bool PushSqStack(SqStack &S, ElemType e) {
    if (MAXSIZE - 1 == S.top) {
        return false;
    }
    S.data[++S.top] = e;
    return true;
}

// 出栈，并返回弹出的元素
bool PopSqStack(SqStack &S, ElemType &e) {
    if (-1 == S.top) {
        return false;
    }
    e = S.data[S.top--];
    return true;
}


/**
 * 队列 操作
 */
// 初始化一个循环队列
void InitSqQueue(SqQueue &Q) {
    Q.front = 0;
    Q.rear = 0;
}

// 入队
bool EnterSqQueue(SqQueue &Q, ElemType e) {
    if ((Q.rear+1)%MAXSIZE == Q.front) {
        return false;
    }
    Q.data[Q.rear++] = e;
    return true;
}

// 出队，并返回出队的元素
bool RemoveSqQueue(SqQueue &Q, ElemType &e) {
    if (Q.rear == Q.front) {
        return false;
    }
    e = Q.data[Q.front];
    Q.front = (Q.front+1)%MAXSIZE;
    return true;
}


/**
 * 新建一个栈，读取标准输入3个整数3 4 5，入栈3 4 5，依次出栈，打印 5 4 3。
 * 新建循环队列（Maxsize为5），读取标准输入3 4 5 6 7，入队7时，队满，打印false，然后依次出队，输出 3 4 5 6
 * @return
 */
int main() {
    // 初始化一个顺序栈
    SqStack S;
    InitSqStack(S);
    // 输入3个整数入栈，然后依次出栈并打印。
    ElemType e_stack;
    for (int i = 0; i < 3; ++i) {
        scanf("%d", &e_stack);
        if(!PushSqStack(S, e_stack)) {
            printf("false\n");
        }
    }
    for (int i = 0; i < 3; ++i) {
        if (PopSqStack(S, e_stack)) {
            printf("%2d", e_stack);
        }
    }
    printf("\n");

    // 初始化一个循环队列
    SqQueue Q;
    InitSqQueue(Q);
    // 输入5个整数入队，然后依次出队并打印
    ElemType e_queue;
    for (int i = 0; i < 5; ++i) {
        scanf("%d", &e_queue);
        if (!EnterSqQueue(Q, e_queue)) {
            printf("false\n");
        }
    }
    for (int i = 0; i < 5; ++i) {
        if (RemoveSqQueue(Q, e_queue)) {
            printf("%2d", e_queue);
        }
    }

    return 0;
}